/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.tesoreria.be.CuentaBancaria;
import org.cip.esymons.tesoreria.be.EnumEstadoCuentaBancaria;
import org.cip.esymons.tesoreria.be.EnumTipoCuentaBancaria;
import org.cip.esymons.tesoreria.be.TipoMoneda;

/**
 *
 * @author Administrador
 */
@Stateless
public class CuentaBancariaFacade implements CuentaBancariaFacadeLocal {

    @PersistenceContext
    private EntityManager em;

    public void create(CuentaBancaria cuentaBancaria) {
        em.persist(cuentaBancaria);
    }

    public void edit(CuentaBancaria cuentaBancaria) {
        em.merge(cuentaBancaria);
    }

    public void remove(CuentaBancaria cuentaBancaria) {
        em.remove(em.merge(cuentaBancaria));
    }

    public CuentaBancaria find(Object id) {
        try {
            return em.find(CuentaBancaria.class, id);
        } catch (Exception e) {
            return null;
        }
    }

    public List<CuentaBancaria> findAll() {
        try {
            return em.createQuery("select object(o) from CuentaBancaria as o").getResultList();
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public List<CuentaBancaria> buscarPorBanco(PersonaJuridica personaJuridica) {
        try {
            return em.createQuery("select object(o) from CuentaBancaria as o Where o.fkBanCodigo=?1").setParameter(1, personaJuridica).getResultList();
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public PersonaJuridica buscarBancodeCB(String codigo) {
        try {
            return (PersonaJuridica)em.createQuery("select o.fkBanCodigo from CuentaBancaria as o Where o.cbaNumcuenta=?1").setParameter(1, codigo).getSingleResult();
        } catch (Exception e) {
            return null;
        }
    }

    public List<CuentaBancaria> buscarCBPorSolicitante(Solicitante solicitante) {
        try {
            return em.createQuery("select object(o) from CuentaBancaria as o Where o.propietarioCuentaBancaria=?1").setParameter(1, solicitante).getResultList();
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public int contarBuscarCuentaBancaria(String cuentaPerteneceA, PersonaNatural personaSeleccionada, PersonaJuridica empresaSeleccionada,
            EnumTipoCuentaBancaria tipoCuentaBancariaSeleccionada,
            TipoMoneda tipoMonedaSeleccionada, PersonaJuridica bancoSeleccionado, EnumEstadoCuentaBancaria estadoCuentaBancariaSeleccionado) {
        try {

            Query q = null;
            StringBuilder sb = new StringBuilder();
            boolean banWhere = false;
            sb.append(" SELECT ");
            sb.append(" count(cb) ");
            sb.append(" FROM");
            sb.append(" CuentaBancaria as cb ");

            Integer cont = 0;
            if (cuentaPerteneceA != null) {
                if (cuentaPerteneceA.equals("PersonaEmpresa")) {
                    sb.append(" Where ");
                    banWhere = true;
                    sb.append(" cb.propietarioCuentaBancaria is not null ");
                    if (personaSeleccionada != null || empresaSeleccionada != null) {
                        sb.append(" and cb.propietarioCuentaBancaria =?").append((++cont).toString());
                    }
                } else {
                    if (cuentaPerteneceA.equals("Cip")) {
                        sb.append(" Where ");
                        banWhere = true;
                        sb.append(" cb.propietarioCuentaBancaria is null ");
                    }
                }
            }

            if (tipoCuentaBancariaSeleccionada != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.cbaTipocuenta =?").append((++cont).toString());
            }
            if (tipoMonedaSeleccionada != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.fkTmoCodigo =?").append((++cont).toString());
            }
            if (bancoSeleccionado != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.fkBanCodigo =?").append((++cont).toString());
            }
            if (estadoCuentaBancariaSeleccionado != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.cbaEstado =?").append((++cont).toString());
            }

            q = em.createQuery(sb.toString());
            cont = 0;
            if (cuentaPerteneceA != null) {
                if (cuentaPerteneceA.equals("PersonaEmpresa")) {
                    if (personaSeleccionada != null) {
                        q.setParameter(++cont,(Solicitante)personaSeleccionada);
                    } else {
                        if (empresaSeleccionada != null) {
                            q.setParameter(++cont, (Solicitante)empresaSeleccionada);
                        }
                    }
                }
            }

            if (tipoCuentaBancariaSeleccionada != null) {
                q.setParameter(++cont, tipoCuentaBancariaSeleccionada);
            }
            if (tipoMonedaSeleccionada != null) {
                q.setParameter(++cont, tipoMonedaSeleccionada);
            }
            if (bancoSeleccionado != null) {
                q.setParameter(++cont, bancoSeleccionado);
            }
            if (estadoCuentaBancariaSeleccionado != null) {
                q.setParameter(++cont, estadoCuentaBancariaSeleccionado);
            }
            return new Integer(q.getSingleResult().toString());
            

        } catch (Exception ex) {
            return 0;
        }
    }

    public List<CuentaBancaria> buscarCuentaBancaria(int cantidad, int posicion, String cuentaPerteneceA, PersonaNatural personaSeleccionada, PersonaJuridica empresaSeleccionada,
            EnumTipoCuentaBancaria tipoCuentaBancariaSeleccionada,
            TipoMoneda tipoMonedaSeleccionada, PersonaJuridica bancoSeleccionado, EnumEstadoCuentaBancaria estadoCuentaBancariaSeleccionado) {
        try {

            Query q = null;
            StringBuilder sb = new StringBuilder();
            boolean banWhere = false;
            sb.append(" SELECT ");
            sb.append(" cb ");
            sb.append(" FROM");
            sb.append(" CuentaBancaria as cb ");

            Integer cont = 0;
            if (cuentaPerteneceA != null) {
                if (cuentaPerteneceA.equals("PersonaEmpresa")) {
                    sb.append(" Where ");
                    banWhere = true;
                    sb.append(" cb.propietarioCuentaBancaria is not null ");
                    if (personaSeleccionada != null || empresaSeleccionada != null) {
                        sb.append(" and cb.propietarioCuentaBancaria =?").append((++cont).toString());
                    }
                } else {
                    if (cuentaPerteneceA.equals("Cip")) {
                        sb.append(" Where ");
                        banWhere = true;
                        sb.append(" cb.propietarioCuentaBancaria is null ");
                    }
                }
            }

            if (tipoCuentaBancariaSeleccionada != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.cbaTipocuenta =?").append((++cont).toString());
            }
            if (tipoMonedaSeleccionada != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.fkTmoCodigo =?").append((++cont).toString());
            }
            if (bancoSeleccionado != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.fkBanCodigo =?").append((++cont).toString());
            }
            if (estadoCuentaBancariaSeleccionado != null) {
                if (banWhere == false) {
                    sb.append(" Where ");
                    banWhere = true;
                } else {
                    sb.append(" and ");
                }
                sb.append(" cb.cbaEstado =?").append((++cont).toString());
            }

            q = em.createQuery(sb.toString());
            cont = 0;
            if (cuentaPerteneceA != null) {
                if (cuentaPerteneceA.equals("PersonaEmpresa")) {
                    if (personaSeleccionada != null) {
                        q.setParameter(++cont,(Solicitante)personaSeleccionada);
                    } else {
                        if (empresaSeleccionada != null) {
                            q.setParameter(++cont, (Solicitante)empresaSeleccionada);
                        }
                    }
                }
            }

            if (tipoCuentaBancariaSeleccionada != null) {
                q.setParameter(++cont, tipoCuentaBancariaSeleccionada);
            }
            if (tipoMonedaSeleccionada != null) {
                q.setParameter(++cont, tipoMonedaSeleccionada);
            }
            if (bancoSeleccionado != null) {
                q.setParameter(++cont, bancoSeleccionado);
            }
            if (estadoCuentaBancariaSeleccionado != null) {
                q.setParameter(++cont, estadoCuentaBancariaSeleccionado);
            }

            q.setMaxResults(cantidad);
            q.setFirstResult(posicion);
            return q.getResultList();

        } catch (Exception ex) {
            return new ArrayList();
        }
    }
}
